#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

typedef int entier;
typedef int (*ptr_fonc)(int,int) ;/*redifinition, nouveau nom*/


int simul_un_param (int (*fon)(int,int));
int simulfix (int nbfils, int (*tab_fon[])(int,int));
int doubler(int pid, int i);
int tripler(int pid, int i);


int main() {
	int nbre_fonct=0;
	int (*tab_fon[])(int,int) ={doubler,tripler};

	
	printf("1 parametre :\n");
	nbre_fonct = simul_un_param(doubler);
	printf("plusieurs parametre :\n");
	
	nbre_fonct = simulfix(2,tab_fon);

	simul_variable(3,doubler,tripler,doubler);
	
	system("pause");
	return 0;
}

/*! \fn int simul_un_param (int (*fon)(int,int))
 *  \param[in] fon pointeur sur la fonction à éxécuter
 *  \return nombre de fonctions éxécutées (normalement, ici 1)
 */
int simul_un_param (int (*fon)(int,int)) {
	int pid=1000;
	int compteur=0;

	if((*fon)(pid,5)==pid) {
		compteur++;
	}
	pid++;

	return compteur;

}

int doubler(int pid, int i) {
	printf("%d\n",2*i);
	return pid;
}

int tripler(int pid, int i) {
	printf("%d\n",3*i);
	return pid;
}

/*! \fn int simulfix (int nbfils, int(*tab_fon[])(int,int))
 *  \param[in] nb_fils le nombre n de fonctions à éxécuter
 *  \param[in] tab_fon tableau de n pointeurs sur les fonctions à éxécuter
 *  \return nombre de fonctions éxécutées
 */
int simulfix (int nbfils, int(*tab_fon[])(int,int)) {
	int j;
	int pid=2000;
	int compteur=0;

	for(j=0; j<nbfils; j++) {
		if((*tab_fon[j])(pid,5)==pid) {
			compteur++;
		}
		pid++;
	}
	return compteur;

}

/*! \fn int simul_variable (int nbfils, ...)
 *  \param[in] nb_fils le nombre n de fonctions à éxécuter
 *  \param[in] ... pointeur(s) sur la(les) fonction(s) à éxécuter
 *  \return nombre de fonctions éxécutées
 */
int simul_variable (int nbfils, ...) {
	va_list ap;
	int j;
	int pid=3000;
	int compteur=0;
	ptr_fonc ptemp;

	va_start(ap,nbfils);

	for(j=0; j<nbfils; j++) {
		ptemp = va_arg(ap,ptr_fonc);
		if((*ptemp)(pid,5)==pid) {
			compteur++;
		}
		pid++;
	}

	va_end(ap);

	return compteur;

}





